/** 网页当前状态判断 (解决没布局完就切换页面造成点聚集在一起)*/
var hidden, state, visibilityChange;
if (typeof document.hidden !== "undefined") {
  hidden = "hidden";
  visibilityChange = "visibilitychange";
  state = "visibilityState";
} else if (typeof document.mozHidden !== "undefined") {
  hidden = "mozHidden";
  visibilityChange = "mozvisibilitychange";
  state = "mozVisibilityState";
} else if (typeof document.msHidden !== "undefined") {
  hidden = "msHidden";
  visibilityChange = "msvisibilitychange";
  state = "msVisibilityState";
} else if (typeof document.webkitHidden !== "undefined") {
  hidden = "webkitHidden";
  visibilityChange = "webkitvisibilitychange";
  state = "webkitVisibilityState";
}
// 添加监听器，在title里显示状态变化

/** 解决浏览器标签切换排列问题 */
var _isNeedReload = false;
var _isGraphLoaded = false;
document.addEventListener(
  visibilityChange,
  function () {
    if (document[state] == "visible") {
      if (_isNeedReload) {
        $("#MainCy").html("");
        $("#TrTxt").removeClass("active");
        getData(_currentKeyNo);
      }
      //document.title = 'hidden-not-loaded'
    } else {
      if (!_isGraphLoaded) {
        _isNeedReload = true;
      }
    }
  },
  false
);
/** end 解决浏览器标签切换排列问题 */

/** end 网页当前状态判断 */

let cy;
let id;
let activeNode;

let _rootData, _rootNode;

let _COLOR = {
  node: { person: "#FD485E", company: "#4ea2f0", current: "#ff9e00" },
  border: { person: "#FD485E", company: "#128BED", current: "#EF941B" },
  line: {
    invest: "#fd485e",
    employ: "#4ea2f0",
    legal: "#4ea2f0",
    default: "#4ea2f0",
  },
};

let _Circle_Radius = { person: 45, company: 65, default: 50 };

let _currentKeyNo,
  _companyRadius = 35,
  _personRadius = 15,
  _circleMargin = 10,
  _circleBorder = 3,
  _layoutNode = {},
  _isFocus = false;
let _maxChildrenLength = 0;

_currentKeyNo = "-2886766351330904521";
console.log(_currentKeyNo);
let _currentNodeId = "-2886766351330904521";
console.log(_currentNodeId);

/****** 工具 ******/
//去重操作,元素为对象
function uniqeByKeys(array, keys) {
  //将对象元素转换成字符串以作比较
  function obj2key(obj, keys) {
    var n = keys.length,
      key = [];
    while (n--) {
      key.push(obj[keys[n]]);
    }
    return key.join("|");
  }

  var arr = [];
  var hash = {};
  for (var i = 0, j = array.length; i < j; i++) {
    var k = obj2key(array[i], keys);
    if (!(k in hash)) {
      hash[k] = true;
      arr.push(array[i]);
    }
  }
  return arr;
}
//去重操作,普通元素
Array.prototype.unique = function () {
  var res = [];
  var json = {};
  for (var i = 0; i < this.length; i++) {
    if (!json[this[i]]) {
      res.push(this[i]);
      json[this[i]] = 1;
    }
  }
  return res;
};

//深复制对象方法
function cloneObj(obj) {
  var newObj = {};
  if (obj instanceof Array) {
    newObj = [];
  }
  for (var key in obj) {
    var val = obj[key];
    //newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; //arguments.callee 在哪一个函数中运行，它就代表哪个函数, 一般用在匿名函数中。
    newObj[key] = typeof val === "object" ? cloneObj(val) : val;
  }
  return newObj;
}

/****** 数据处理 ******/

// 数据处理：将原始数据转换成graph数据
function getRootData(list) {
  var graph = {};
  graph.nodes = [];
  graph.links = [];

  //graph.nodes
  for (var i = 0; i < list.length; i++) {
    var nodes = list[i].graph.nodes;
    for (var j = 0; j < nodes.length; j++) {
      var node = nodes[j];
      var o = {};
      o.nodeId = node.id;
      o.data = {};
      o.data.obj = node;
      //o.data.showStatus = 'NORMAL'; // NORMAL HIGHLIGHT DULL
      o.data.showStatus = null; // NORMAL HIGHLIGHT DULL
      o.layout = {};
      o.layout.level = null; // 1 当前查询节点
      o.layout.singleLinkChildren = []; // 只连接自己的node
      graph.nodes.push(o);

      // 设置_rootNode
      if (_currentNodeId == node.id) {
        _rootNode = o;
      }
    }
  }
  graph.nodes = uniqeByKeys(graph.nodes, ["nodeId"]);

  //graph.links
  for (var i = 0; i < list.length; i++) {
    var relationships = list[i].graph.relationships;

    for (var k = 0; k < relationships.length; k++) {
      var relationship = relationships[k];
      var o = {};
      o.data = {};
      o.data.obj = relationship;
      //o.data.showStatus = 'NORMAL'; // NORMAL HIGHLIGHT DULL
      o.data.showStatus = null; // NORMAL HIGHLIGHT DULL
      o.sourceNode = getGraphNode(relationship.startNode, graph.nodes);
      o.targetNode = getGraphNode(relationship.endNode, graph.nodes);
      o.linkId = relationship.id;
      o.source = getNodesIndex(relationship.startNode, graph.nodes);
      o.target = getNodesIndex(relationship.endNode, graph.nodes);
      graph.links.push(o);
    }
  }
  graph.links = uniqeByKeys(graph.links, ["linkId"]);

  //emplyRevert(graph.links);
  //mergeLinks(graph.links);
  setLevel(graph.nodes, graph.links);
  setCategoryColor(graph.nodes, graph.links);

  return graph;
}
// 数据处理：董监高箭头翻转
function emplyRevert(links) {
  links.forEach(function (link, i) {
    if (link.data.obj.type == "EMPLOY") {
      var tmpObj = link.source;
      var tmpObjNode = link.sourceNode;
      link.source = link.target;
      link.sourceNode = link.targetNode;
      link.target = tmpObj;
      link.targetNode = tmpObjNode;
    }
  });
}
// 数据处理：董监高、法人线合并
function mergeLinks(links) {
  links.forEach(function (link, i) {
    if (
      link.sourceNode.data.obj.labels[0] == "Person" &&
      link.data.obj.type == "LEGAL"
    ) {
      links.forEach(function (nextLink, j) {
        if (
          link.linkId != nextLink.linkId &&
          link.sourceNode.nodeId == nextLink.sourceNode.nodeId &&
          link.targetNode.nodeId == nextLink.targetNode.nodeId &&
          nextLink.data.obj.type == "EMPLOY"
        ) {
          links.splice(j, 1);
        }
      });
    }

    if (
      link.sourceNode.data.obj.labels[0] == "Person" &&
      link.data.obj.type == "EMPLOY"
    ) {
      links.forEach(function (nextLink, j) {
        if (
          link.linkId != nextLink.linkId &&
          link.sourceNode.nodeId == nextLink.sourceNode.nodeId &&
          link.targetNode.nodeId == nextLink.targetNode.nodeId &&
          nextLink.data.obj.type == "LEGAL"
        ) {
          links.splice(j, 1);
        }
      });
    }
  });
  //        console.log(links);
}
// 数据处理：设置节点层级
function setLevel(svg_nodes, svg_links) {
  function getNextNodes(nodeId, links, parentLevel) {
    var nextNodes = [];
    for (var i = 0; i < links.length; i++) {
      var link = links[i];
      if (nodeId == link.sourceNode.nodeId && !link.targetNode.layout.level) {
        link.targetNode.layout.level = parentLevel;
        nextNodes.push(link.targetNode);
      } else if (
        nodeId == link.targetNode.nodeId &&
        !link.sourceNode.layout.level
      ) {
        link.sourceNode.layout.level = parentLevel;
        nextNodes.push(link.sourceNode);
      }
    }
    nextNodes = uniqeByKeys(nextNodes, ["nodeId"]);

    return nextNodes;
  }

  var level = 1;
  var nodes = [];
  nodes.push(_rootNode);
  console.log("来了啊。。。");
  console.log(_rootNode);
  while (nodes.length) {
    var nextNodes = [];
    for (var i = 0; i < nodes.length; i++) {
      var node = nodes[i];
      node.layout.level = level;
      nextNodes = nextNodes.concat(getNextNodes(node.nodeId, svg_links, level));
    }
    level++;
    nodes = nextNodes;
  }
}
// 数据处理：设置节点角色
function setCategoryColor(nodes, links) {
  for (var i = 0; i < links.length; i++) {
    var sameLink = {}; // 两点间连线信息
    sameLink.length = 0; // 两点间连线数量
    sameLink.currentIndex = 0; // 当前线索引
    sameLink.isSetedSameLink = false;
    links[i].sameLink = sameLink;
  }

  /*链接相同两点的线*/
  for (var i = 0; i < links.length; i++) {
    var baseLink = links[i];

    if (baseLink.sameLink.isSetedSameLink == false) {
      baseLink.sameLink.isSetedSameLink = true;
      var nodeId1 = baseLink.sourceNode.nodeId;
      var nodeId2 = baseLink.targetNode.nodeId;

      var sameLinks = [];
      sameLinks.push(baseLink);
      for (var j = 0; j < links.length; j++) {
        var otherLink = links[j];
        if (
          baseLink.linkId != otherLink.linkId &&
          !otherLink.sameLink.isSetedSameLink
        ) {
          if (
            (otherLink.sourceNode.nodeId == nodeId1 &&
              otherLink.targetNode.nodeId == nodeId2) ||
            (otherLink.sourceNode.nodeId == nodeId2 &&
              otherLink.targetNode.nodeId == nodeId1)
          ) {
            sameLinks.push(otherLink);
            otherLink.sameLink.isSetedSameLink = true;
          }
        }
      }

      for (var k = 0; k < sameLinks.length; k++) {
        var oneLink = sameLinks[k];
        oneLink.sameLink.length = sameLinks.length; // 两点间连线数量
        oneLink.sameLink.currentIndex = k; // 当前线索引
      }
    }
  }

  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    if (
      _currentKeyNo == node.data.obj.properties.keyNo ||
      _currentNodeId == node.nodeId
    ) {
      // 当前节点
      node.data.color = _COLOR.node.current;
      node.data.strokeColor = _COLOR.border.current;
    } else if (node.data.obj.labels[0] == "Company") {
      node.data.color = _COLOR.node.company;
      node.data.strokeColor = _COLOR.border.company;
    } else {
      node.data.color = _COLOR.node.person;
      node.data.strokeColor = _COLOR.border.person;
    }
  }
}
// 数据处理：设置唯一孩子
function setSingleLinkNodes(links) {
  //console.log('setSingleLinkNodes: ', links);
  function isSingleLink(nodeId, links) {
    var hasLinks = 0;
    var isSingle = true;
    for (var i = 0; i < links.length; i++) {
      var link = links[i];
      if (
        link.targetNode.nodeId == nodeId ||
        link.sourceNode.nodeId == nodeId
      ) {
        hasLinks++;
      }
      if (hasLinks > 1) {
        isSingle = false;
        break;
      }
    }

    return isSingle;
  } // isSingleLink

  links.forEach(function (link, i) {
    if (isSingleLink(link.sourceNode.nodeId, links)) {
      link.targetNode.layout.singleLinkChildren.push(link.sourceNode);
    }
    if (isSingleLink(link.targetNode.nodeId, links)) {
      link.sourceNode.layout.singleLinkChildren.push(link.targetNode);
    }
  });
}
// 数据处理：根据nodeId获取node 索引
function getNodesIndex(nodeId, nodes) {
  var index = 0;
  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    if (nodeId == node.nodeId) {
      index = i;
      break;
    }
  }
  return index;
}
// 数据处理：node是否存在
function isNodeExist(nodeId, nodes) {
  var exist = false;
  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    if (nodeId == node.nodeId) {
      exist = true;
      break;
    }
  }
  return exist;
}
// 数据处理：根据nodes过滤出相应连线（没有节点的连线删除）
function filterLinksByNodes(nodes, allLinks) {
  function isExists(nodes, nodeId) {
    var exist = false;
    for (var i = 0; i < nodes.length; i++) {
      var node = nodes[i];
      if (node.nodeId == nodeId) {
        exist = true;
        break;
      }
    }
    return exist;
  }
  var sel_links = [];
  for (var i = 0; i < allLinks.length; i++) {
    var link = allLinks[i];
    if (
      isExists(nodes, link.sourceNode.nodeId) &&
      isExists(nodes, link.targetNode.nodeId)
    ) {
      //link.source = getNodesIndex(link.sourceNode.nodeId,nodes);
      //link.target = getNodesIndex(link.targetNode.nodeId,nodes);
      sel_links.push(link);
    }
  }
  return sel_links;
}
// 数据处理：根据links过滤出相应节点(没有连线的节点删除)
function filterNodesByLinks(nodes, links) {
  function isExists(links, nodeId) {
    var exist = false;
    for (var i = 0; i < links.length; i++) {
      var link = links[i];
      if (
        link.sourceNode.nodeId == nodeId ||
        link.targetNode.nodeId == nodeId
      ) {
        exist = true;
        break;
      }
    }
    return exist;
  }
  var sel_nodes = [];
  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    if (isExists(links, node.nodeId)) {
      sel_nodes.push(node);
    }
  }
  return sel_nodes;
}
// 数据处理：根据nodeId获取node
function getGraphNode(nodeId, nodes) {
  var node = null;
  for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].nodeId == nodeId) {
      node = nodes[i];
      break;
    }
  }
  return node;
}
// 数据处理：获取子节点
function getSubNodes(node, links) {
  var subNodes = [];
  var nodeId = node.nodeId;
  var level = node.layout.level;
  for (var i = 0; i < links.length; i++) {
    var link = links[i];
    if (
      link.sourceNode.nodeId == nodeId &&
      link.targetNode.layout.level == level + 1
    ) {
      subNodes.push(link.targetNode);
    }
    if (
      link.targetNode.nodeId == nodeId &&
      link.sourceNode.layout.level == level + 1
    ) {
      subNodes.push(link.sourceNode);
    }
  }
  subNodes = uniqeByKeys(subNodes, ["nodeId"]);
  return subNodes;
}

/****** Html 相关 ******/
// 水印居中
function printLogoFixed() {
  var bodyH = $("body").height();
  var imgH = $(".printLogo img").height();
  var top = (parseFloat(bodyH) - parseFloat(imgH)) / 2;
  $(".printLogo img").css({ "margin-top": top + "px" });
}
//筛选面板：显示
function selPanelShow() {
  $(".tp-sel").fadeIn();
  //$('.tp-sel').addClass('zoomIn');
  $("#TrSel").addClass("active");
}
//筛选面板：隐藏
function selPanelHide() {
  $(".tp-sel").fadeOut();
  $("#TrSel").removeClass("active");
}
//筛选面板：列表更新
function selPanelUpdateList(nodes, links, isShowCheckbox) {
  $(".tp-list").html("");
  for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    var index = i + 1;
    var name = node.data.obj.properties.name;
    var keyNo = node.data.obj.properties.keyNo;
    var str = "";
    if (isShowCheckbox) {
      str =
        '<div class="checkbox" node_id="' +
        node.nodeId +
        '" keyno="' +
        keyNo +
        '"> <input checked type="checkbox"><label> ' +
        index +
        "." +
        name +
        "</label> </div>";
      //            var str = '<div class="checkbox" node_id="'+ node.nodeId +'" keyno="'+ keyNo +'"> <label> ' + index + '.' + name + '</label> </div>';
    } else {
      str =
        '<div class="checkbox" node_id="' +
        node.nodeId +
        '" keyno="' +
        keyNo +
        '"><label> ' +
        index +
        "." +
        name +
        "</label> </div>";
    }

    $(".tp-list").append(str);
  }

  $(".tp-list > div > label").click(function () {
    var _parent = $(this).parent();
    var nodeId = _parent.attr("node_id");

    focusReady(getGraphNode(nodeId, nodes));
  });

  $(".tp-list > div > input").click(function () {
    /*var _this = $(this);
        var _parent = $(this).parent();
        var nodeId = _parent.attr('node_id');
        var checkedNodeIds = $('.tp-list').attr('node_ids');
        if(checkedNodeIds){
            checkedNodeIds = checkedNodeIds.split(',');
        }*/

    var checkedNodeIds = [];
    $(".tp-list input:checked").each(function () {
      var _parent = $(this).parent();
      var nodeId = _parent.attr("node_id");
      checkedNodeIds.push(nodeId);
    });

    /*if(_this.is(':checked')){
            checkedNodeIds.push(nodeId);
            nodes.splice(1,1);
            console.log('checked');
        } else {
            console.log('un checked');
            var sub_nodes = []
            sub_nodes = nodes.splice(0,1);
            console.log(nodes);
            console.log(sub_nodes);
            graphInit(nodes, links);
        }*/
    highLight(checkedNodeIds, cy);
    /*// 需要隐藏的节点及子节点
        var choosedNode = getGraphNode(nodeId,nodes);
        var subNodes = getSubNodes(choosedNode,links);
        subNodes.push(choosedNode);

        // 剩下的节点
        var lastNodes = [];
        for(var i = 0; i < nodes.length; i++){
            var node = nodes[i];
            if(!getGraphNode(node.nodeId,subNodes)){
                lastNodes.push(node);
            }
        }

        // 剩下的连线
        var lastLinks = filterLinksByNodes(lastNodes,links);

        graphInit(lastNodes, lastLinks);
        if(_this.is(':checked')){
            nodes.splice(1,1);
            console.log('checked');
        } else {
            console.log('un checked');
            var sub_nodes = []
            sub_nodes = nodes.splice(0,1);
            console.log(nodes);
            console.log(sub_nodes);
            graphInit(nodes, links);
        }
        console.log(nodeId);*/
  });
}
//筛选面板：聚焦准备
function focusReady(node) {
  filterReset();
  $("#FocusInput").val(node.data.obj.properties.name);
  $("#FocusInput").attr("node_id", node.nodeId);
  $("#FocusBt").text("聚焦");
  $("#FocusBt").removeClass("focusDisable");
  $("#ClearInput").show();
}
//筛选面板：取消聚焦
function focusCancel() {
  $("#ClearInput").hide();
  $("#FocusBt").text("聚焦");
  $("#FocusBt").addClass("focusDisable");
  $("#FocusInput").val("");
  $("#FocusInput").attr("node_id", "");
  selPanelUpdateList(_rootData.nodes, _rootData.links, true);
  cancelHighLight();
}

function resizeScreen() {
  // if(isFullScreen()){
  //     $('#TrFullScreen').addClass('active');
  //     $('#TrFullScreen').html('<span class="screen2ed"></span>退出');
  // } else {
  //     $('#TrFullScreen').removeClass('active');
  //     $('#TrFullScreen').html('<span class="screen2"></span>全屏');
  // }
  //cy.pan();
  /*if(document.body.clientHeight>700){
        $('#Main').height(document.body.clientHeight-66);
        console.log(document.body.clientHeight);
    }else{
        $('#Main').height(640);
    }*/
}

function drawGraph(elements) {
  _currentKeyNo,
    (_companyRadius = 35),
    (_personRadius = 15),
    (_circleMargin = 10),
    (_circleBorder = 3);
  cy = cytoscape({
    container: document.getElementById("MainCy"),
    motionBlur: false,
    textureOnViewport: false,
    wheelSensitivity: 0.1,
    elements: elements,
    minZoom: 0.4,
    maxZoom: 2.5,
    layout: {
      name: "preset",
      componentSpacing: 40,
      nestingFactor: 12,
      padding: 10,
      edgeElasticity: 800,
      stop: function (e) {
        //解决浏览器标签切换排列问题
        if (document[state] == "hidden") {
          _isNeedReload = true;
          //                        console.log('stop _isNeedReload=true');
        } else {
          _isNeedReload = false;
        }
        setTimeout(function () {
          if (document[state] == "hidden") {
            _isGraphLoaded = false;
            console.log("stop _isGraphLoaded=false");
          } else {
            _isGraphLoaded = true;
          }
        }, 1000);
      },
    },
    style: [
      {
        selector: "node",
        style: {
          shape: "ellipse",
          width: function (ele) {
            let type = ele.data("type").toLowerCase();
            return _Circle_Radius[type]
              ? _Circle_Radius[type]
              : _Circle_Radius["default"];
          },
          height: function (ele) {
            let type = ele.data("type").toLowerCase();
            return _Circle_Radius[type]
              ? _Circle_Radius[type]
              : _Circle_Radius["default"];
          },
          "background-color": function (ele) {
            return ele.data("color");
          },
          "background-fit": "cover",
          "background-image": function (ele) {
            var hasImage = ele.data("hasImage");
            var keyNo = ele.data("keyNo");
            var type = ele.data("type");
            if (hasImage && type == "Person") {
              return keyNo;
            } else {
              return "none";
            }
          },
          // 'background-image-crossorigin': 'use-credentials',
          "border-color": function (ele) {
            return ele.data("borderColor");
          },
          "border-width": function (ele) {
            if (ele.data("hasImage") && ele.data("type") == "Person") {
              return 3;
            } else {
              return 1;
            }
          },
          "border-opacity": 1,
          label: function (ele) {
            var label = ele.data("name");
            var length = label.length;
            if (length <= 5) {
              // 4 5 4排列
              return label;
            } else if (length >= 5 && length <= 9) {
              return (
                label.substring(0, length - 5) +
                "\n" +
                label.substring(length - 5, length)
              );
            } else if (length >= 9 && length <= 13) {
              return (
                label.substring(0, 4) +
                "\n" +
                label.substring(4, 9) +
                "\n" +
                label.substring(9, 13)
              );
            } else {
              return (
                label.substring(0, 4) +
                "\n" +
                label.substring(4, 9) +
                "\n" +
                label.substring(9, 12) +
                ".."
              );
            }
          },
          "z-index-compare": "manual",
          "z-index": 20,
          color: "#fff",
          //'padding-top':0,
          padding: function (ele) {
            // if(ele.data("type") == 'Company'){
            //     return 3;
            // }
            return 0;
          },
          "font-size": 12,
          //'min-height':'400px',
          //'ghost':'yes',
          //'ghost-offset-x':300,
          //'font-weight':800,
          //'min-zoomed-font-size':6,
          "font-family": "microsoft yahei",
          "text-wrap": "wrap",
          "text-max-width": 60,
          "text-halign": "center",
          "text-valign": "center",
          "overlay-color": "#fff",
          "overlay-opacity": 0,
          "background-opacity": 1,
          "text-background-color": "#000",
          "text-background-shape": "roundrectangle",
          "text-background-opacity": function (ele) {
            return 0;
            // if(ele.data('hasImage') && ele.data('type') == 'Person'){
            //     return 0.3;
            // } else {
            //     return 0
            // }
          },
          "text-background-padding": 0,
          "text-margin-y": function (ele) {
            let length = ele.data("name").length;
            //当前节点有图片
            return length < 5 ? 0 : 4;
          },
        },
      },
      {
        selector: "edge",
        style: {
          "line-style": function (ele) {
            return "solid";
            /*if(ele.data('data').obj.type == 'INVEST'){
                            return 'solid';
                        } else {
                            return 'dashed'
                        }*/
          },
          "curve-style": "bezier",
          "control-point-step-size": 20,
          "target-arrow-shape": "triangle-backcurve",
          "target-arrow-color": function (ele) {
            return ele.data("color");
          },
          "arrow-scale": 1,
          "line-color": function (ele) {
            return "#b3b3b3";
            //return ele.data("color");
          },
          label: function (ele) {
            return ele.data("label");
          },
          "text-opacity": 0.3,
          "font-size": 12,
          "background-color": function (ele) {
            return "#b3b3b3";
          },
          width: 0.3,
          "overlay-color": "#fff",
          "overlay-opacity": 0,
          "font-family": "microsoft yahei",
        },
      },
      {
        selector: ".autorotate",
        style: {
          "edge-text-rotation": "autorotate",
        },
      },
      {
        selector: ".nodeActive",
        style: {
          //'z-index':300,
          "border-color": function (ele) {
            return ele.data("color");
          },
          "border-width": 10,
          "border-opacity": 0.5,
        },
      },
      {
        selector: ".edgeShow",
        style: {
          color: "#999",
          "text-opacity": 1,
          "font-weight": 400,
          label: function (ele) {
            return ele.data("label");
          },
          "font-size": 10,
        },
      },
      {
        selector: ".edgeActive",
        style: {
          "arrow-scale": 0.8,
          width: 1.5,
          color: "#330",
          "text-opacity": 1,
          "font-size": 12,
          "text-background-color": "#fff",
          "text-background-opacity": 0.8,
          "text-background-padding": 0,
          "source-text-margin-y": 20,
          "target-text-margin-y": 20,
          //'text-margin-y':3,
          "z-index-compare": "manual",
          "z-index": 1,
          "line-color": function (ele) {
            return ele.data("color");
          },
          "target-arrow-color": function (ele) {
            return ele.data("color");
          },
          label: function (ele) {
            /*if(ele.data('data').obj.type == 'INVEST'){
                            return 'solid';
                        } else {
                            return 'dashed'
                        }*/
            return ele.data("label");
          },
        },
      },
      {
        selector: ".hidetext",
        style: {
          "text-opacity": 0,
        },
      },
      {
        selector: ".dull",
        style: {
          "z-index": 1,
          opacity: 0.2,
        },
      },
      {
        selector: ".nodeHover",
        style: {
          shape: "ellipse",
          "background-opacity": 0.9,
        },
      },
      {
        selector: ".edgeLevel1",
        style: {
          label: function (ele) {
            return ele.data("label");
          },
        },
      },
      {
        selector: ".edgeShowText",
        style: {
          label: function (ele) {
            return ele.data("label");
          },
        },
      },
      {
        selector: ".edgeHideText",
        style: {
          label: function (ele) {
            return "";
          },
        },
      },
      {
        selector: ".lineFixed", // 加载完成后，加载该类，修复线有锯齿的问题
        style: {
          "overlay-opacity": 0,
        },
      },
    ],
  });

  cy.on("click", "node", function (evt) {
    if (evt.target._private.style["z-index"].value == 20) {
      // 非暗淡状态
      _isFocus = true;
      var node = evt.target;
      console.log(node);

      highLight([node._private.data.id], cy);

      if (node.hasClass("nodeActive")) {
        activeNode = null;
        $("#company-detail").hide();
        node.removeClass("nodeActive");
        cy.collection("edge").removeClass("edgeActive");
      } else {
        var nodeData = node._private.data;
        if (nodeData.type == "Company") {
          //showDetail2(nodeData.keyNo,'company_muhou3');
          cy.collection("node").addClass("nodeDull");
        } else {
          //showDetail2(nodeData.keyNo,'company_muhou3','person');
          cy.collection("node").addClass("nodeDull");
        }

        activeNode = node;
        cy.collection("node").removeClass("nodeActive");

        cy.collection("edge").removeClass("edgeActive");
        node.addClass("nodeActive");
        node.neighborhood("edge").removeClass("opacity");
        node.neighborhood("edge").addClass("edgeActive");
        node.neighborhood("edge").connectedNodes().removeClass("opacity");
      }
      //_firstTab = false;
    } else {
      _isFocus = false;
      activeNode = null;
      cy.collection("node").removeClass("nodeActive");
      $(".tp-detail").fadeOut();
      cancelHighLight();
    }
  });
  var showTipsTime = null;
  cy.on("mouseover", "node", function (evt) {
    if (evt.target._private.style["z-index"].value == 20) {
      // 非暗淡状态
      //
      $("#Main").css("cursor", "pointer");

      //
      var node = evt.target;
      node.addClass("nodeHover");
      if (!_isFocus) {
        cy.collection("edge").removeClass("edgeShow");
        cy.collection("edge").removeClass("edgeActive");
        node.neighborhood("edge").addClass("edgeActive");
      }

      // 提示
      clearTimeout(showTipsTime);
      //if(node._private.data.name.length > 13 || (node._private.data.keyNo[0] == 'p' && node._private.data.name.length > 3) || node._private.data.layout.revel > 2){
      if (
        node._private.data.name.length > 13 ||
        (node._private.data.keyNo &&
          node._private.data.keyNo[0] == "p" &&
          node._private.data.name.length > 3)
      ) {
        showTipsTime = setTimeout(function () {
          var name = node._private.data.name;

          // 显示在节点位置
          /*var tipWidth = name.length * 12 + 16;
                    var x = node._private.data.d3x + 655 - (tipWidth / 2);
                    var y = node._private.data.d3y + 598;
                    if(node._private.data.type == 'Person'){
                        y = node._private.data.d3y + 590;
                    }*/

          // 显示在鼠标位置
          var event = evt.originalEvent || window.event;
          var x = event.clientX + 10;
          var y = event.clientY + 10;

          var html =
            "<div class='tips' style='font-size:12px;background:white;box-shadow:0px 0px 3px #999;border-radius:1px;opacity:1;padding:1px;padding-left:8px;padding-right:8px;display:none;position: absolute;left:" +
            x +
            "px;top:" +
            y +
            "px;'>" +
            name +
            "</div>";
          $("body").append($(html));
          $(".tips").fadeIn();
        }, 600);
      }
    }
  });
  cy.on("mouseout", "node", function (evt) {
    $("#Main").css("cursor", "default");

    // 提示
    $(".tips").fadeOut(function () {
      $(".tips").remove();
    });

    clearTimeout(showTipsTime);

    //
    var node = evt.target;
    node.removeClass("nodeHover");
    if (!_isFocus) {
      cy.collection("edge").removeClass("edgeActive");
      /*if(moveTimeer){
                clearTimeout(moveTimeer);
            }*/
      /*moveTimeer = setTimeout(function() {
                cy.collection("edge").addClass("edgeActive");
                //cy.collection("edge").addClass("edgeShow");
            }, 300);
            if(activeNode){
                activeNode.neighborhood("edge").addClass("edgeActive");
            }*/
    }
  });
  cy.on("mouseover", "edge", function (evt) {
    if (!_isFocus) {
      var edge = evt.target;
      /*if(moveTimeer){
                clearTimeout(moveTimeer);
            }*/
      cy.collection("edge").removeClass("edgeActive");
      edge.addClass("edgeActive");
      /*if(activeNode){
                activeNode.neighborhood("edge").addClass("edgeActive");
            }*/
    }
  });
  cy.on("mouseout", "edge", function (evt) {
    if (!_isFocus) {
      var edge = evt.target;
      edge.removeClass("edgeActive");
      // moveTimeer = setTimeout(function() {
      //     cy.collection("edge").addClass("edgeActive");
      //     //cy.collection("edge").addClass("edgeShow");
      // }, 400);
      if (activeNode) {
        activeNode.neighborhood("edge").addClass("edgeActive");
      }
    }
  });
  cy.on("vmousedown", "node", function (evt) {
    var node = evt.target;
    if (!_isFocus) {
      highLight([node._private.data.id], cy);
    }
  });
  cy.on("tapend", "node", function (evt) {
    if (!_isFocus) {
      cancelHighLight();
    }
  });

  cy.on("click", "edge", function (evt) {
    console.log("click edge");
    _isFocus = false;
    activeNode = null;
    cy.collection("node").removeClass("nodeActive");
    $(".tp-detail").fadeOut();
    cancelHighLight();
  });
  cy.on("click", function (event) {
    var evtTarget = event.target;

    if (evtTarget === cy) {
      _isFocus = false;
      activeNode = null;
      cy.collection("node").removeClass("nodeActive");
      $(".tp-detail").fadeOut();
      cancelHighLight();
      focusCancel();
      filterReset();

      //cy.collection("edge").addClass("edgeActive");
    } else {
      //console.log('tap on some element');
    }
  });

  cy.on("zoom", function () {
    if (cy.zoom() < 0.5) {
      cy.collection("node").addClass("hidetext");
      cy.collection("edge").addClass("hidetext");
    } else {
      cy.collection("node").removeClass("hidetext");
      cy.collection("edge").removeClass("hidetext");
    }

    // 加载完成后，加载该类，修复线有锯齿的问题
    setTimeout(function () {
      cy.collection("edge").removeClass("lineFixed");
      cy.collection("edge").addClass("lineFixed");
    }, 200);
  });

  let number = 0;
  cy.on("pan", function () {
    // 加载完成后，加载该类，修复线有锯齿的问题
    if (number == 0) {
      setTimeout(function () {
        cy.collection("edge").removeClass("lineFixed");
        cy.collection("edge").addClass("lineFixed");
      }, 200);
    }
    number++;
  });

  // 定位
  cy.nodes().positions(function (node, i) {
    // 保持居中
    if (
      node._private.data.keyNo == _currentKeyNo ||
      node._private.data.nodeId == _currentNodeId
    ) {
      var position = cy.pan();
      cy.pan({
        x: position.x - node._private.data.d3x,
        y: position.y - node._private.data.d3y,
      });
    }
    //
    return {
      x: node._private.data.d3x,
      y: node._private.data.d3y,
    };
  });

  cy.ready(function () {
    //console.log('ready...........');
    cy.zoom({
      level: 1.0000095043745896, // the zoom level
    });
    $("#load_data").hide();

    // 加载完成后，加载该类，修复线有锯齿的问题
    setTimeout(function () {
      cy.collection("edge").addClass("lineFixed");
    }, 400);

    // 首页的插入图谱默认高亮第一层
    if (
      _rootData &&
      _rootData.nodes.length > 30 &&
      typeof _INSERT_URL != "undefined" &&
      _INSERT_URL
    ) {
      highLight([_rootNode.nodeId], cy);
    }
  });

  cy.nodes(function (node) {
    //console.log('nodes...........');
    /*
        // 当前查询节点关系文字显示
        if(node._private.data.nodeId == _rootNode.nodeId){
            node.neighborhood("edge").addClass("edgeLevel1");
        }*/
  });
}
function highLight(nodeIds, cy) {
  cy.collection("node").removeClass("nodeActive");
  cy.collection("edge").removeClass("edgeActive");
  cy.collection("node").addClass("dull");
  cy.collection("edge").addClass("dull");

  for (var i = 0; i < nodeIds.length; i++) {
    var nodeId = nodeIds[i];
    cy.nodes(function (node) {
      var nodeData = node._private.data;
      if (nodeData.id == nodeId) {
        node.removeClass("dull");
        //node.addClass('nodeActive');
        node.neighborhood("edge").removeClass("dull");
        node.neighborhood("edge").addClass("edgeActive");
        node.neighborhood("edge").connectedNodes().removeClass("dull");
        //node.neighborhood("edge").connectedNodes().addClass("nodeActive");
      }
    });
  }
}
function highLightFilter(nodeIds, cy) {
  function isInNodeIds(nodeId) {
    for (var i = 0; i < nodeIds.length; i++) {
      if (nodeId == nodeIds[i]) {
        return true;
        break;
      }
    }
    return false;
  }

  cy.collection("node").removeClass("nodeActive");
  cy.collection("edge").removeClass("edgeActive");
  cy.collection("node").addClass("dull");
  cy.collection("edge").addClass("dull");

  for (var i = 0; i < nodeIds.length; i++) {
    var nodeId = nodeIds[i];
    cy.nodes(function (node) {
      var nodeData = node._private.data;
      if (nodeData.id == nodeId) {
        node.removeClass("dull");
        //node.addClass('nodeActive');
        /*node.neighborhood("edge").removeClass("dull");
                node.neighborhood("edge").addClass("edgeActive");
                node.neighborhood("edge").connectedNodes().removeClass("dull");*/
        //node.neighborhood("edge").connectedNodes().addClass("nodeActive");
      }
    });
  }

  cy.edges(function (edge) {
    var data = edge._private.data;
    if (isInNodeIds(data.target) && isInNodeIds(data.source)) {
      edge.removeClass("dull");
      edge.addClass("edgeActive");
    }
  });
}
function cancelHighLight() {
  cy.collection("node").removeClass("nodeActive");
  cy.collection("edge").removeClass("edgeActive");
  cy.collection("node").removeClass("dull");
  cy.collection("edge").removeClass("dull");
}

/**其他*/

function getD3Position(graph) {
  getLayoutNode(graph);

  function filterLinks1(graph) {
    // 筛选用于布局的links
    var layoutLinks = [];
    for (var i = 0; i < graph.links.length; i++) {
      var link = graph.links[i];
      //console.log(link);
      var sourceLevel = link.sourceNode.layout.level;
      var targetLevel = link.targetNode.layout.level;
      // console.log('sourceLevel：' + sourceLevel + ', targetLevel：' + targetLevel);
      var sourceNode = link.sourceNode;
      var targetNode = link.targetNode;
      //            sourceNode.layout.isSetLink = false;
      //            targetNode.layout.isSetLink = false;

      //            if(!sourceNode.layout.isSetLink && !targetNode.layout.isSetLink){
      if (
        (sourceLevel == 1 && targetLevel == 2) ||
        (sourceLevel == 2 && targetLevel == 1)
      ) {
        //                    sourceNode.layout.isSetLink = true;
        //                    targetNode.layout.isSetLink = true;
        layoutLinks.push(link);
      }
      if (
        (sourceLevel == 2 && targetLevel == 3) ||
        (sourceLevel == 3 && targetLevel == 2)
      ) {
        //                    sourceNode.layout.isSetLink = true;
        //                    targetNode.layout.isSetLink = true;
        layoutLinks.push(link);
      }
    }

    layoutLinks.forEach(function (link, i) {
      if (link.targetNode.layout.level == 3) {
        layoutLinks.forEach(function (alink, j) {
          if (
            alink.linkId != link.linkId &&
            (alink.targetNode.nodeId == link.targetNode.nodeId ||
              alink.sourceNode.nodeId == link.targetNode.nodeId)
          ) {
            layoutLinks.splice(j, 1);
          }
        });
      }

      if (link.sourceNode.layout.level == 3) {
        layoutLinks.forEach(function (alink, j) {
          if (
            alink.linkId != link.linkId &&
            (alink.targetNode.nodeId == link.sourceNode.nodeId ||
              alink.sourceNode.nodeId == link.sourceNode.nodeId)
          ) {
            layoutLinks.splice(j, 1);
          }
        });
      }
    });

    return layoutLinks;
  }

  function filterLinks2(graph) {
    // 筛选用于布局的links
    var layoutLinks = [];
    for (var i = 0; i < graph.links.length; i++) {
      var link = graph.links[i];
      var sourceLevel = link.sourceNode.layout.level;
      var targetLevel = link.targetNode.layout.level;
      var sourceNode = link.sourceNode;
      var targetNode = link.targetNode;

      if (
        (sourceLevel == 1 && targetLevel == 2) ||
        (sourceLevel == 2 && targetLevel == 1)
      ) {
        layoutLinks.push(link);
      }
      if (
        (sourceLevel == 2 && targetLevel == 3) ||
        (sourceLevel == 3 && targetLevel == 2)
      ) {
        layoutLinks.push(link);
      }
    }

    return layoutLinks;
  }

  function initD3Data(graph) {
    //
    function getIndex(val, arr) {
      var index = 0;
      for (var i = 0; i < arr.length; i++) {
        var obj = arr[i];
        if (val == obj.nodeId) {
          index = i;
          break;
        }
      }
      return index;
    }

    /*封装符合d3的数据*/
    for (var i = 0; i < graph.nodes.length; i++) {
      var node = graph.nodes[i];
      node.id = node.nodeId;
    }

    for (var i = 0; i < graph.links.length; i++) {
      var link = graph.links[i];
      link.source = getIndex(link.sourceNode.nodeId, graph.nodes);
      link.target = getIndex(link.targetNode.nodeId, graph.nodes);
      link.index = i; //
    }

    graph.layoutLinks = filterLinks1(graph);

    // 围绕节点最大数值
    setSingleLinkNodes(graph.layoutLinks);
    graph.nodes.forEach(function (node, i) {
      if (
        node.layout.singleLinkChildren.length &&
        _maxChildrenLength < node.layout.singleLinkChildren.length
      ) {
        _maxChildrenLength = node.layout.singleLinkChildren.length;
      }
    });
    // _maxChildrenLength = 60;
    console.log("围绕节点最大数值:" + _maxChildrenLength);
  }

  initD3Data(graph); //

  //    var width = $("#MainD3 svg").width();
  // width = $(window).width();
  // console.log(width);
  //    var height = $("#MainD3 svg").height();
  // height = $(window).height();
  // console.log(height);

  var strength = -600,
    distanceMax = 330,
    theta = 0,
    distance = 130,
    colideRadius = 35,
    distanceMin = 400;
  // 根据节点数量调节
  if (graph.nodes.length < 50) {
    strength = -800;
    distanceMax = 400;
  } else if (graph.nodes.length > 50 && graph.nodes.length < 100) {
    strength = -800;
    distanceMax = 350;
    distance = 130;
    colideRadius = 35;
  } else if (graph.nodes.length > 100 && graph.nodes.length < 150) {
    strength = -900;
    distanceMax = 450;
  } else if (graph.nodes.length > 150 && graph.nodes.length < 200) {
    strength = -1000;
    distanceMax = 500;
  } else if (graph.nodes.length > 200) {
    strength = -1600;
    distanceMax = 500;
    (theta = 0.6), (distance = 100), (colideRadius = 35);
  }

  // 根据围绕数量调节
  if (_maxChildrenLength > 50 && _maxChildrenLength < 100) {
    strength = -2000;
    distanceMax = 500;
  } else if (_maxChildrenLength > 1000 && _maxChildrenLength < 2000) {
    strength = -4000;
    distanceMax = 1500;
  }

  d3.forceSimulation(graph.nodes)
    .force(
      "charge",
      d3
        .forceManyBody()
        .strength(strength)
        .distanceMax(distanceMax)
        .theta(theta)
    )
    .force("link", d3.forceLink(graph.links).distance(distance))
    .force("center", d3.forceCenter())
    .force(
      "collide",
      d3.forceCollide().radius(function () {
        return colideRadius;
      })
    );
  //.force('forceY', d3.forceY().strength(0.04))
}

//设置符合Layout的node
function getLayoutNode(graphData) {
  var layoutNode = {
    current: _rootNode,
    level1: [],
    level2: [],
    level3: [],
    level4: [],
    level5: [],
    other: [],
  };

  graphData.nodes.forEach(function (node, i) {
    switch (node.layout.level) {
      case 1:
        layoutNode.level1.push(node);
        break;
      case 2:
        layoutNode.level2.push(node);
        break;
      case 3:
        layoutNode.level3.push(node);
        break;
      case 4:
        layoutNode.level4.push(node);
        break;
      case 5:
        layoutNode.level5.push(node);
        break;
      default:
        layoutNode.other.push(node);
        break;
    }
  });

  _layoutNode = layoutNode;

  return layoutNode;
}
//将rootData转换成cy图谱框架所需要的数据结构
function transformData(graphData) {
  // id = graphData.nodes[0].nodeId;
  var els = {};
  els.nodes = [];
  els.edges = [];

  graphData.links.forEach(function (link, i) {
    let lineType = link.data.obj.type.toLowerCase();
    let color = _COLOR.line[lineType]
      ? _COLOR.line[lineType]
      : _COLOR.line["default"];
    let label = link.data.obj.properties.name;

    els.edges.push({
      data: {
        data: link.data,
        color: color,
        id: link.linkId,
        label: label,
        source: link.sourceNode.nodeId,
        target: link.targetNode.nodeId,
      },
      classes: "autorotate",
    });
  });

  graphData.nodes.forEach(function (node) {
    els.nodes.push({
      data: {
        nodeId: node.nodeId,
        type: node.data.obj.labels[0],
        keyNo: node.data.obj.properties.keyNo,
        data: node.data,
        id: node.nodeId,
        name: node.data.obj.properties.name,
        category: node.data.category,
        color: node.data.color,
        borderColor: node.data.strokeColor,
        layout: node.layout,
        d3x: node.x,
        d3y: node.y,
        hasImage: node.data.obj.properties.hasImage,
        //labelLine:1 // 解决文字行距问题，第1行
      },
    });
  });

  return els;
}
// 图谱、筛选面板更新
function domUpdate(graphData) {
  getD3Position(graphData);

  setTimeout(function () {
    drawGraph(transformData(graphData));
  }, 500);

  selPanelUpdateList(graphData.nodes, graphData.links, true);
}

function getData(keyNo, param) {
  $("#load_data").show();
  var url = "aa.json";
  $.ajax({
    url: url,
    type: "GET",
    data: param,
    dataType: "JSON",
    success: function (re) {
      re = re.success;

      if (
        !re ||
        re.results == undefined ||
        !re.results[0] ||
        !re.results[0].data.length ||
        re.results[0].data[0].graph.nodes.length == 0
      ) {
        $("#load_data").hide();
        $(".printLogo").hide();
        $(".tp-foot").hide();
        $("#Main").hide();
        $("#no_data").show();
        return;
      } else {
        $(".printLogo").show();
        $(".tp-foot").show();
        $("#Main").show();
        $("#no_data").hide();
      }

      _rootData = getRootData(re.results[0].data);

      domUpdate(_rootData);
    },
    error: function (data) {
      $("#load_data").hide();
      $(".printLogo").hide();
      $(".tp-foot").hide();
      $("#Main").hide();
      $("#no_data").show();
    },
  });
}

window.onresize = function () {
  //console.log('window.onresize');
  resizeScreen();
  printLogoFixed();
};
$(document).ready(function () {
  printLogoFixed();
  getData();
  /**工具栏。。。*/

  $("#LiSel").click(function () {
    console.log("功能尚未开启");
  });
  $("#LiFullScreen").click(function () {
    fullScreen();
  });
  $("#LiRefresh").click(function () {
    refresh(_currentKeyNo);
  });
  $("#LiSave").click(function () {
    canvasImg(cy.png({ full: true, bg: "#0000", scale: 1.8 }));
  });

  $("#zoomIn").click(function () {
    scale(1);
  });
  $("#zoomOut").click(function () {
    scale(2);
  });
  $("#LiFont").click(function () {
    toggleText();
  });
});
